﻿//817. 链表组件
//给定链表头结点 head，该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums，该列表是上述链表中整型值的一个子集。
//返回列表 nums 中组件的个数，这里对组件的定义为：链表中一段最长连续结点的值（该值必须在列表 nums 中）构成的集合。


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    int numComponents(ListNode* head, vector<int>& nums)
    {
        int ans = 0;
        unordered_set<int> set;
        for (auto x : nums)
        {
            set.insert(x);
        }
        int prev = -1;
        for (auto cur = head; cur; cur = cur->next)
        {
            int x = cur->val;
            //不存在
            if (set.count(x) == 0)
            {
                if (prev != -1)
                {
                    ans++;
                    prev = -1;
                }
            }
            //存在
            else
            {
                prev = x;
            }
        }
        if (prev != -1)
            ans++;
        return ans;
    }
};